package com.rabbitmq.demo;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;

import java.nio.charset.StandardCharsets;

/**
 * @ClassName Consumer
 * @Description 消费者
 * @Author Kx
 * @Date 2025/10/9 10:56
 * @Version 1.0
 */
public class Consumer {
    /**
     * 消息队列
     */
    private static final String QUEUE_NAME = "test";

    private static final ConnectionFactory connectionFactory;

    /**
     * 初始化连接工厂
     */
    static {
        connectionFactory = new ConnectionFactory();
        // 设置连接地址
        connectionFactory.setHost("localhost");
        // 设置连接端口
        connectionFactory.setPort(5672);
    }

    /** 
     * 接受消息
    */
    public static void receive() {
        try {
            // 创建连接
            Connection connection = connectionFactory.newConnection();
            // 创建通信通道
            Channel channel = connection.createChannel();
            // 创建队列（如果队列存在则不会再创建）
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            // 创建一个接受消息所需要的回调处理器
            // consumerTag：消费者的唯一标识(消费者ID)
            // delivery：消息的载体
            DeliverCallback callback = (consumerTag, delivery) -> {
                // 获取消息（消息队列中的内容是字节数组，因此转换为 String）
                String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
                System.out.println("消费者接收到消息：" + message);
            };

            // 订阅消息
            // 参数一：队列名称
            // 参数二：是否自动签收(true 表示自动签收) 自动签收就是消息处理完后会自动给 rabbitmq 回馈一个消息表达处理完毕
            // 参数三：消息的回调处理器（处理消息的核心逻辑）
            // 参数四：消息者取消订阅时的回调处理器
            channel.basicConsume(QUEUE_NAME, true, callback, consumerTage -> {

            });
        } catch (Exception e) {
            throw new RuntimeException("消费异常" + e);
        }
    }

    public static void main(String[] args) {
        receive();
    }
}
